#include "napi/native_api.h"
#include <gtest/gtest.h>
#include <vector>
#include <hilog/log.h>

static napi_value Add(napi_env env, napi_callback_info info)
{
    size_t argc = 2;
    napi_value args[2] = {nullptr};

    napi_get_cb_info(env, info, &argc, args , nullptr, nullptr);

    napi_valuetype valuetype0;
    napi_typeof(env, args[0], &valuetype0);

    napi_valuetype valuetype1;
    napi_typeof(env, args[1], &valuetype1);

    double value0;
    napi_get_value_double(env, args[0], &value0);

    double value1;
    napi_get_value_double(env, args[1], &value1);

    napi_value sum;
    napi_create_double(env, value0 + value1, &sum);

    return sum;

}

static napi_value NAPI_Global_InitGoogleTestNapi(napi_env env, napi_callback_info info) {
    // TODO: implements the code;
    size_t argc = 1;
    napi_value args[1];
    napi_status status;

    // 1. 获取 JavaScript 传入的参数（字符串数组）
    status = napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
    if (status != napi_ok || argc < 1) {
        napi_throw_error(env, "EINVAL", "Missing arguments array");
        return nullptr;
    }

    // 2. 将 JS 字符串数组转换为 C++ 的 char** argv
    std::vector<std::string> argStrings;
    std::vector<char*> argv;
    uint32_t arrayLength;
    napi_get_array_length(env, args[0], &arrayLength);

    for (uint32_t i = 0; i < arrayLength; i++) {
        napi_value element;
        napi_get_element(env, args[0], i, &element);

        // 提取字符串
        size_t strLength;
        napi_get_value_string_utf8(env, element, nullptr, 0, &strLength);
        std::string str(strLength + 1, '\0');
        napi_get_value_string_utf8(env, element, &str[0], strLength + 1, &strLength);
        argStrings.push_back(str);
    }

    // 构建 char* 数组（argv）
    for (auto& s : argStrings) {
        argv.push_back(&s[0]);
    }
    argv.push_back(nullptr); // 以 nullptr 结尾

    // 3. 调用 Google Test 初始化
    int argc_val = static_cast<int>(argv.size() - 1);
    testing::InitGoogleTest(&argc_val, argv.data());

    // 4. 返回 RUN_ALL_TESTS() 结果
    int testResult = RUN_ALL_TESTS();

    // 5. 返回结果给 JavaScript
    napi_value result;
    napi_create_int32(env, testResult, &result);
    return result;
}
static napi_value RunAllTests(napi_env env, napi_callback_info info)
{
    // TODO: implements the code;
    // 1. 解析入参（假设传入输出文件路径）
    size_t argc = 1;
    napi_value args[1];
    napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);

    // 2. 将ArkTS字符串参数转为C++字符串
    char outputPath[256];
    size_t pathLen;
    napi_get_value_string_utf8(env, args[0], outputPath, sizeof(outputPath), &pathLen);

     // 2. 直接调用gtest执行测试（无需加载ArkTS模块）
    
    
    testing::GTEST_FLAG(output) = "xml:" + std::string(outputPath);
    
//    OH_LOG_INFO(LOG_INFO,"Test result file: %{public}d",outputPath);
//    OH_LOG_Print((LOG_INFO), LOG_INFO, 0, 0L, "Test result file: %{public}d", outputPath));
    
    int result = RUN_ALL_TESTS();

    // 3. 返回执行结果
    napi_value jsResult;
    napi_create_int32(env, result, &jsResult);
    return jsResult; // ✅ 返回测试结果
    
//    // 3. 加载ArkTS模块（假设模块名为"entry"）
//    napi_value testModule;
//    napi_status status = napi_load_module(env, "@com.example.mytest/TestRunner", &testModule);
//    if (status != napi_ok) {
//        napi_throw_error(env, nullptr, "Failed to load TestRunner module");
//        return nullptr;
//    }
//
//    // 4. 获取ArkTS侧的RunAllTests函数
//    napi_value runTestsFunc;
//    status = napi_get_named_property(env, testModule, "RunAllTests", &runTestsFunc);
//    if (status != napi_ok) {
//        napi_throw_error(env, nullptr, "Function RunAllTests not found");
//        return nullptr;
//    }

//    // 5. 调用ArkTS函数（传递文件路径参数）
//    napi_value argv[1];
//    napi_create_string_utf8(env, outputPath, NAPI_AUTO_LENGTH, &argv[0]);
//    napi_value result;
//    status = napi_call_function(env, testModule, runTestsFunc, 1, argv, &result);
//    
//    // 6. 处理结果
//    if (status != napi_ok) {
//        OH_LOG_ERROR(LOG_APP, "Test execution failed: %{public}d", status);
//        napi_throw_error(env, nullptr, "Test execution error");
//    }
//    return nullptr;
}
EXTERN_C_START
static napi_value Init(napi_env env, napi_value exports) {
    napi_property_descriptor desc[] = {
        {"add", nullptr, Add, nullptr, nullptr, nullptr, napi_default, nullptr},
        {"InitGoogleTestNapi", nullptr, NAPI_Global_InitGoogleTestNapi, nullptr, nullptr,nullptr, napi_default, nullptr},
        { "RunAllTests", nullptr, RunAllTests, nullptr, nullptr, nullptr, napi_default, nullptr }
    };
    
    napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc);
    return exports;
}
EXTERN_C_END

static napi_module demoModule = {
    .nm_version = 1,
    .nm_flags = 0,
    .nm_filename = nullptr,
    .nm_register_func = Init,
    .nm_modname = "native_test",
    .nm_priv = ((void*)0),
    .reserved = { 0 },
};

extern "C" __attribute__((constructor)) void RegisterEntryModule(void)
{
    napi_module_register(&demoModule);
}
